// /**********************************************************************
// 参考地址
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-c/esp8266-nodemcu-web-client/http-request/

// 1-4 MQTT服务端连接操作
// http://www.taichi-maker.com/homepage/esp8266-nodemcu-iot/iot-tuttorial/mqtt-tutorial/4-mqtt-server-connection/
// MQTT客户端连接服务端一共有两步。
// 首先MQTT客户端将会向服务端发送连接请求。该请求实际上是一个包含有连接请求信息的数据包。这个数据包的官方名称为CONNECT。
// MQTT服务端收到客户端连接请求后，会向客户端发送连接确认。同样的，该确认也是一个数据包。这个数据包官方名称为CONNACK。

// cleanSession 默认为true
// 被设置为“true”。那么服务端不需要客户端确认收到报文，也不会保存任何报文。在这种情况下，即使客户端错过了服务端发来的报文，也没办法让服务端再次发送报文。其实我们从字面上也很容易理解。cleanSession 的第一个词是clean。这个词的意思是clean（干净）的。服务端一旦发送完报文，就会把报文忘得“干干净净”了。
// 请注意，如果需要服务端保存重要报文，光设置cleanSession 为false是不够的，还需要传递的MQTT信息QoS级别大于0。

// keepAlive – 心跳时间间隔
// KeepAlive用于服务端实时了解客户端是否与其保持连接的情况。


// returnCode – 连接返回码

// sessionPresent – 当前会话  cleanSession 为true sessionPresent 就为false
// 简言之，CONNACK报文的sessionPresent与CONNECT报文的cleanSession相互配合。

// 公用MQTT服务器列表

// 位置导航: 首页 / 零基础入门学用物联网总目录 / MQTT篇目录 /本页

// 然也物联 (国内)

// 官网地址：http://www.ranye-iot.net
// MQTT服务器地址：test.ranye-iot.net
// TCP 端口：1883
// TCP/TLS 端口：8883

// Mosquitto (国外)

// 官网地址：http://www.mosquitto.org
// MQTT服务器地址：test.mosquitto.org
// TCP 端口：1883
// TCP/TLS 端口：8883
// WebSockets 端口：8080
// Websocket/TLS 端口：8081

// HiveMQ (国外)

// 官网地址：https://www.hivemq.com
// MQTT服务器地址：broker.hivemq.com
// TCP 端口：1883
// WebSockets 端口：8000
// ***********************************************************************/
// #include <WiFi.h>
// #include <PubSubClient.h>
 
// // 设置wifi接入信息
// WiFiClient wifiClient;
// const char* ssid = "SEVNCE";//WiFi 5G连不上
// const char* password = "qtrj2008";

// //设置mqtt服务器信息
// // 如以上MQTT服务器无法正常连接，请前往以下页面寻找解决方案
// // http://www.taichi-maker.com/public-mqtt-broker/
// const char* mqttServer = "test.ranye-iot.net";
// String mqttClientId  = "huawo_";
// PubSubClient mqttClient(wifiClient);

// void connectMQTTServer(){
//   // 根据ESP8266的MAC地址生成客户端ID（避免与其它ESP8266的客户端ID重名）
//   mqttClientId = mqttClientId + WiFi.macAddress();
 
//   // 连接MQTT服务器
//   if (mqttClient.connect(mqttClientId.c_str())) { 
//     Serial.println("MQTT Server connect Success");
//     Serial.println("MQTT Server Address: ");
//     Serial.println(mqttServer);
//     Serial.println("mqttClientId:");
//     Serial.println(mqttClientId);
//   } else {
//     Serial.println("MQTT Server conntect Failed");
//     Serial.println(mqttClient.state());
//     delay(3000);
//   }   
// }
 
// // ESP8266连接wifi
// void connectWifi(){
 
//   WiFi.begin(ssid, password);
 
//   //等待WiFi连接,成功连接后输出成功信息
//   while (WiFi.status() != WL_CONNECTED) {
//     delay(1000);
//     Serial.print(".");
//   }
//   Serial.println(""); 
//   Serial.print(ssid);
//   Serial.println(" WiFi connect Success");  
//   Serial.println(""); 
// }
 
// void setup() {
//   Serial.begin(9600);
 
//   //设置ESP8266工作模式为无线终端模式
//   WiFi.mode(WIFI_STA);
//   // 连接WiFi
//   connectWifi();
  
//   // 设置MQTT服务器和端口号
//   mqttClient.setServer(mqttServer, 1883);
 
//    // 连接MQTT服务器
//   connectMQTTServer();
// }
 
// void loop() { 
//   if (mqttClient.connected()) { // 如果开发板成功连接服务器    
//     mqttClient.loop();          // 保持客户端心跳
//   } else {                  // 如果开发板未能成功连接服务器
//     connectMQTTServer();    // 则尝试连接服务器
//   }
// }
 
